/*
*********************************************************************************************************
*
*    模块名称 : H7-TOOL 输出端口的电平控制
*    文件名称 : bsp_power_tvcc.c
*    版    本 : V1.0
*    说    明 : 通过I2C数字电位器MCP4018控制电平电压
*
*    修改记录 :
*        版本号  日期        作者     说明
*        V1.0    2018-12-08 armfly  正式发布
*
*    Copyright (C), 2018-2030, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/

#include "bsp.h"
#include "param.h"

/* PC13控制LDO输出 */
#define ALL_TVCC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()

#define TVCC_EN_GPIO    GPIOC
#define TVCC_EN_PIN     GPIO_PIN_13

#define TVCC_OFF()      BSP_SET_GPIO_0(TVCC_EN_GPIO, TVCC_EN_PIN)
#define TVCC_ON()       BSP_SET_GPIO_1(TVCC_EN_GPIO, TVCC_EN_PIN)

#define TVCC_IS_ON()    ((TVCC_EN_GPIO->IDR & TVCC_EN_PIN) != 0) /* 如果已使能输出，返回ture */

/* MCP4018数字电位器控制LDO输出电压值 (128档）
    VOUT = 1.25 * (1 + R1 / R2);
*/

/* 2018-12-10 4位半万用表实测TVCC输出电压档位关系 
    左侧档位，右侧电压mv
    
    根据数据表推算计算公式为
    
    Vout = (1 + ((127 - X) / X)) * Vref   （其中 Vref = 1.256，个体有差异）
    
    校准时，可以设置 x = 34，测量实际电压，反推出Vref。
*/
const uint16_t volt_tab[] =
        {
                0,
                4916, /* 0-32之间不变化，4916mV */
                1,
                4916, /* 0-32之间不变化，4916mV */
                2,
                4916, /* 0-32之间不变化，4916mV */
                3,
                4916, /* 0-32之间不变化，4916mV */
                4,
                4916, /* 0-32之间不变化，4916mV */
                5,
                4916, /* 0-32之间不变化，4916mV */
                6,
                4916, /* 0-32之间不变化，4916mV */
                7,
                4916, /* 0-32之间不变化，4916mV */
                8,
                4916, /* 0-32之间不变化，4916mV */
                9,
                4916, /* 0-32之间不变化，4916mV */
                10,
                4916, /* 0-32之间不变化，4916mV */
                11,
                4916, /* 0-32之间不变化，4916mV */
                12,
                4916, /* 0-32之间不变化，4916mV */
                13,
                4916, /* 0-32之间不变化，4916mV */
                14,
                4916, /* 0-32之间不变化，4916mV */
                15,
                4916, /* 0-32之间不变化，4916mV */
                16,
                4916, /* 0-32之间不变化，4916mV */
                17,
                4916, /* 0-32之间不变化，4916mV */
                18,
                4916, /* 0-32之间不变化，4916mV */
                19,
                4916, /* 0-32之间不变化，4916mV */
                20,
                4916, /* 0-32之间不变化，4916mV */
                21,
                4916, /* 0-32之间不变化，4916mV */
                22,
                4916, /* 0-32之间不变化，4916mV */
                23,
                4916, /* 0-32之间不变化，4916mV */
                24,
                4916, /* 0-32之间不变化，4916mV */
                25,
                4916, /* 0-32之间不变化，4916mV */
                26,
                4916, /* 0-32之间不变化，4916mV */
                27,
                4916, /* 0-32之间不变化，4916mV */
                28,
                4916, /* 0-32之间不变化，4916mV */
                29,
                4916, /* 0-32之间不变化，4916mV */
                30,
                4916, /* 0-32之间不变化，4916mV */
                31,
                4916, /* 0-32之间不变化，4916mV */
                32,
                4916,
                33,
                4829,
                34,
                4687,
                35,
                4554,
                36,
                4431,
                37,
                4312,
                38,
                4199, /* 4.2V */
                39,
                4092,
                40,
                3983,
                41,
                3886,
                42,
                3794,
                43,
                3706,
                44,
                3622,
                45,
                3542,
                46,
                3465,
                47,
                3392,
                48,
                3321, /* 3.3V */
                49,
                3254,
                50,
                3189,
                51,
                3126,
                52,
                3064,
                53,
                3007, /* 3.0V */
                54,
                2951,
                55,
                2898,
                56,
                2843, /* 2.8V */
                57,
                2794,
                58,
                2745,
                59,
                2699,
                60,
                2653,
                61,
                2610, /* 2.6V */
                62,
                2568,
                63,
                2528, /* 2.5V */
                64,
                2487,
                65,
                2450,
                66,
                2412,
                67,
                2377,
                68,
                2341,
                69,
                2308,
                70,
                2275,
                71,
                2243,
                72,
                2212,
                73,
                2182,
                74,
                2152,
                75,
                2124,
                76,
                2095,
                77,
                2069,
                78,
                2042,
                79,
                2017,
                80,
                1991,
                81,
                1969,
                82,
                1944,
                83,
                1921,
                84,
                1898,
                85,
                1876,
                86,
                1854,
                87,
                1833,
                88,
                1812, /* 1.8V */
                89,
                1792,
                90,
                1772,
                91,
                1752,
                92,
                1733,
                93,
                1715,
                94,
                1697,
                95,
                1679,
                96,
                1661,
                97,
                1645,
                98,
                1628,
                99,
                1611,
                100,
                1595,
                101,
                1580,
                102,
                1564,
                103,
                1549,
                104,
                1534,
                105,
                1520,
                106,
                1505,
                107,
                1491,
                108,
                1477,
                109,
                1463,
                110,
                1450,
                111,
                1437,
                112,
                1424,
                113,
                1412,
                114,
                1399,
                115,
                1387,
                116,
                1375,
                117,
                1364,
                118,
                1352,
                119,
                1340,
                120,
                1330,
                121,
                1319,
                122,
                1308,
                123,
                1297,
                124,
                1286,
                125,
                1277,
                126,
                1266,
                127,
                1256,
};

uint8_t bsp_VoltToMCP4018(uint16_t _volt);

/*
*********************************************************************************************************
*    函 数 名: bsp_InitTVCC
*    功能说明: 设置TVCC电压
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitTVCC(void)
{
    GPIO_InitTypeDef gpio_init;

    /* 第1步：打开GPIO时钟 */
    ALL_TVCC_GPIO_CLK_ENABLE();

    //TVCC_OFF();

    gpio_init.Mode = GPIO_MODE_OUTPUT_PP;        /* 设置开漏输出 */
    gpio_init.Pull = GPIO_NOPULL;                        /* 上下拉电阻不使能 */
    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH; /* GPIO速度等级 */
    gpio_init.Pin = TVCC_EN_PIN;
    HAL_GPIO_Init(TVCC_EN_GPIO, &gpio_init);

    //bsp_InitMCP4018(); /* 初始化数字电位器 */
}

/*
*********************************************************************************************************
*    函 数 名: bsp_SetTVCC
*    功能说明: 设置TVCC电压. 0表示关闭
*    形    参: 电压值3300表示3.300V, 单位 1mV.  值范围 ： 0 - 5000
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_SetTVCC(uint16_t _volt)
{
    float vref = 1259.45;
    float ff;
    uint16_t x;

    if (_volt == 0)
    {
        TVCC_OFF();
    }
    else
    {
        /*
            计算公式
            Vout = (1 + ((127 - X) / X)) * Vref   （其中 Vref = 1.256，个体有差异）
            Vout = (127 / X) * Vref
        
            ===> X = 127 * Vref / Vout;
        
            X = 127 时， Y = 1.261V
            X = 36 时， Y = 4.442V
        */
        vref = g_tCalib.TVCCSet.y2 / (127 / g_tCalib.TVCCSet.x2); /* 单位为V */
        vref = vref * 1000;                                                                                /* 单位为mV */

        ff = 127 * vref / _volt;
        x = ff + (float)0.5; /* 四舍五入 */

        if (x > 127)
        {
            x = 127;
        }

        /* 电压值换算为数字电位器的寄存器值 */
        MCP4018_WriteData(x);

        TVCC_ON();
    }
}

/*
*********************************************************************************************************
*    函 数 名: bsp_VoltToMCP4018
*    功能说明: 电压转换为MCP4018寄存器
*    形    参: 电压值3300表示3.300V, 单位 1mV.  值范围 ： 0 - 5000
*    返 回 值: 无
*********************************************************************************************************
*/
uint8_t bsp_VoltToMCP4018(uint16_t _volt)
{
    uint8_t i, re;
    uint16_t a, b;

    if (_volt >= volt_tab[1])
    {
        return 0;
    }
    else if (_volt < volt_tab[2 * 127 + 1])
    {
        return 127;
    }

    re = 127;
    for (i = 1; i <= 127; i++)
    {
        a = volt_tab[2 * (i - 1) + 1];
        b = volt_tab[2 * i + 1];
        if (_volt <= a && _volt >= b)
        {
            if (_volt - a < b - _volt)
            {
                re = i - 1;
            }
            else
            {
                re = i;
            }
            break;
        }
    }
    return re;
}

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
